/*
 * @lc app=leetcode.cn id=189 lang=swift
 *
 * [189] 旋转数组
 */

// @lc code=start
class Solution {
    func rotate(_ nums: inout [Int], _ k: Int) {
        var nk = k % nums.count
        // 1.暴力循环
        // for _ in 0..<k {
        //     var last = nums[nums.count - 1]
        //     for j in 0..<nums.count {
        //         var temp = nums[j]
        //         nums[j] = last
        //         last = temp
        //     }
        // }
        // 2.借助数组
        // var temp: [Int] = nums
        // for i in 0..<nums.count {
        //     temp[(i+nk)%nums.count] = nums[i]
        // }
        // for i in 0..<nums.count {
        //     nums[i] = temp[i]
        // }
        // 3.环状替换
        // var count = 0
        // var start = 0
        // while count < nums.count {
        //     var current = start
        //     var prev = nums[start]
        //     repeat {
        //         var next = (current + nk) % nums.count
        //         var temp = nums[next]
        //         nums[next] = prev
        //         prev = temp
        //         current = next
        //         count += 1
        //     } while start != current
        //     start += 1
        // }
        // 4.三次反转
        reverse(&nums, 0, nums.count-1)
        reverse(&nums, 0, nk-1)
        reverse(&nums, nk, nums.count-1)
    }

    func reverse(_ nums: inout [Int], _ start: Int, _ end: Int) {
        var l = start
        var r = end
        while l < r {
            (nums[l], nums[r]) = (nums[r], nums[l])
            l += 1
            r -= 1
        }
    }
}
// @lc code=end

